package de.fhin.mas.agents.manager.behaviours;

import jade.core.behaviours.CyclicBehaviour;
import jade.core.behaviours.ParallelBehaviour;
import jade.lang.acl.ACLMessage;
import jade.lang.acl.MessageTemplate;
import de.fhin.mas.MASEvents;
import de.fhin.mas.agents.manager.ManagerAgent;

/**
 * Weitergabe von Infos an die GUI/den Benutzer
 * 
 * @author Ast
 * 
 */
public class HandleUserInfos extends ParallelBehaviour {
	private static final long serialVersionUID = 1275483325038495071L;
	private ManagerAgent managerAgent;

	private class OutputByTemplate extends CyclicBehaviour {
		private static final long serialVersionUID = -1213082426830660361L;
		private MessageTemplate mt;
		private String outputMsg;

		public OutputByTemplate(MASEvents event, int performative, String outputMsg) {
			this.mt = MessageTemplate.and(MessageTemplate.MatchConversationId(event.getName()), MessageTemplate
					.MatchPerformative(performative));
			this.outputMsg = outputMsg;
		}

		@Override
		public void action() {
			ACLMessage msg = managerAgent.receive(this.mt);
			if (msg == null)
				block();
			else
				managerAgent.sendMsgToUser(msg.getSender().getLocalName() + ": " + this.outputMsg);
		}
	}

	public HandleUserInfos(ManagerAgent a) {
		this.managerAgent = a;

		addSubBehaviour(new OutputByTemplate(MASEvents.MOVEMENT_OF_PLATFORM_NECESSARY, ACLMessage.CFP,
				"Plattform muss bewegt werden!"));
		addSubBehaviour(new OutputByTemplate(MASEvents.LOADING_OBJECT, ACLMessage.INFORM, "Objekt wird geladen..."));
		addSubBehaviour(new OutputByTemplate(MASEvents.OBJECT_LOADED, ACLMessage.INFORM, "Objekt geladen!"));
		addSubBehaviour(new OutputByTemplate(MASEvents.OBJECT_OUT_OF_REACH, ACLMessage.INFORM,
				"Objekt ist außerhalb der Reichweite!"));
		addSubBehaviour(new OutputByTemplate(MASEvents.CHANGE_OF_LOCATION_NECESSARY, ACLMessage.REQUEST,
				"Anderes Gebiet muss angefahren werden!"));
		addSubBehaviour(new OutputByTemplate(MASEvents.OBJECT_UNSEIZABLE, ACLMessage.INFORM,
				"Objekt ist nicht greifbar!"));
		addSubBehaviour(new OutputByTemplate(MASEvents.TARGET_FOUND, ACLMessage.INFORM, "Ziel-Objekt gefunden!"));
		addSubBehaviour(new OutputByTemplate(MASEvents.TARGET_OBJECT_REACHED, ACLMessage.INFORM,
				"Ziel-Objekt erreicht!"));
		addSubBehaviour(new OutputByTemplate(MASEvents.UNLOADING_OBJECT, ACLMessage.INFORM, "Objekt wird abgeladen..."));
		addSubBehaviour(new OutputByTemplate(MASEvents.OBJECT_UNLOADED, ACLMessage.INFORM,
				"Objekt wird abgeladen! Auftrag erfüllt!"));
		addSubBehaviour(new OutputByTemplate(MASEvents.CHARGING_STATION_REACHED, ACLMessage.INFORM,
				"Die Ladestation wurde erreicht."));
		addSubBehaviour(new OutputByTemplate(MASEvents.STORAGE_REACHED, ACLMessage.INFORM, "Das Lager wurde erreicht."));
		addSubBehaviour(new OutputByTemplate(MASEvents.TARGET_OBJECT_REACHED, ACLMessage.INFORM,
				"Das Objekt wurde erreicht."));
	}
}
